#pragma once

namespace DX4WRT
{
	namespace DXGI
	{
		public enum class AdapterOptions
		{
			None = DXGI_ADAPTER_FLAG_NONE,
			Remote = DXGI_ADAPTER_FLAG_REMOTE,
			Software = DXGI_ADAPTER_FLAG_SOFTWARE,
		};

		public enum class AlphaMode
		{
			Unspecified = DXGI_ALPHA_MODE_UNSPECIFIED,
			Premultiplied = DXGI_ALPHA_MODE_PREMULTIPLIED,
			Straight = DXGI_ALPHA_MODE_STRAIGHT,
			Ignore = DXGI_ALPHA_MODE_IGNORE,
		};


		public enum class ComputePreemptionGranularity
		{
/* Only Desktop
			DMABufferBoundary = DXGI_COMPUTE_PREEMPTION_DMA_BUFFER_BOUNDARY,
			DispatchBoundary = DXGI_COMPUTE_PREEMPTION_DISPATCH_BOUNDARY,
			ThreadGroupBoundary = DXGI_COMPUTE_PREEMPTION_THREAD_GROUP_BOUNDARY,
			ThreadBoundary = DXGI_COMPUTE_PREEMPTION_THREAD_BOUNDARY,
			InstructionBoundary = DXGI_COMPUTE_PREEMPTION_INSTRUCTION_BOUNDARY 
*/
		};

		public enum class Format //TODO
		{
			DXGI_FORMAT_UNKNOWN                      = 0,
			DXGI_FORMAT_R32G32B32A32_TYPELESS        = 1,
			DXGI_FORMAT_R32G32B32A32_FLOAT           = 2,
			DXGI_FORMAT_R32G32B32A32_UINT            = 3,
			DXGI_FORMAT_R32G32B32A32_SINT            = 4,
			DXGI_FORMAT_R32G32B32_TYPELESS           = 5,
			DXGI_FORMAT_R32G32B32_FLOAT              = 6,
			DXGI_FORMAT_R32G32B32_UINT               = 7,
			DXGI_FORMAT_R32G32B32_SINT               = 8,
			DXGI_FORMAT_R16G16B16A16_TYPELESS        = 9,
			DXGI_FORMAT_R16G16B16A16_FLOAT           = 10,
			DXGI_FORMAT_R16G16B16A16_UNORM           = 11,
			DXGI_FORMAT_R16G16B16A16_UINT            = 12,
			DXGI_FORMAT_R16G16B16A16_SNORM           = 13,
			DXGI_FORMAT_R16G16B16A16_SINT            = 14,
			DXGI_FORMAT_R32G32_TYPELESS              = 15,
			DXGI_FORMAT_R32G32_FLOAT                 = 16,
			DXGI_FORMAT_R32G32_UINT                  = 17,
			DXGI_FORMAT_R32G32_SINT                  = 18,
			DXGI_FORMAT_R32G8X24_TYPELESS            = 19,
			DXGI_FORMAT_D32_FLOAT_S8X24_UINT         = 20,
			DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS     = 21,
			DXGI_FORMAT_X32_TYPELESS_G8X24_UINT      = 22,
			DXGI_FORMAT_R10G10B10A2_TYPELESS         = 23,
			DXGI_FORMAT_R10G10B10A2_UNORM            = 24,
			DXGI_FORMAT_R10G10B10A2_UINT             = 25,
			DXGI_FORMAT_R11G11B10_FLOAT              = 26,
			DXGI_FORMAT_R8G8B8A8_TYPELESS            = 27,
			DXGI_FORMAT_R8G8B8A8_UNORM               = 28,
			DXGI_FORMAT_R8G8B8A8_UNORM_SRGB          = 29,
			DXGI_FORMAT_R8G8B8A8_UINT                = 30,
			DXGI_FORMAT_R8G8B8A8_SNORM               = 31,
			DXGI_FORMAT_R8G8B8A8_SINT                = 32,
			DXGI_FORMAT_R16G16_TYPELESS              = 33,
			DXGI_FORMAT_R16G16_FLOAT                 = 34,
			DXGI_FORMAT_R16G16_UNORM                 = 35,
			DXGI_FORMAT_R16G16_UINT                  = 36,
			DXGI_FORMAT_R16G16_SNORM                 = 37,
			DXGI_FORMAT_R16G16_SINT                  = 38,
			DXGI_FORMAT_R32_TYPELESS                 = 39,
			DXGI_FORMAT_D32_FLOAT                    = 40,
			DXGI_FORMAT_R32_FLOAT                    = 41,
			DXGI_FORMAT_R32_UINT                     = 42,
			DXGI_FORMAT_R32_SINT                     = 43,
			DXGI_FORMAT_R24G8_TYPELESS               = 44,
			DXGI_FORMAT_D24_UNORM_S8_UINT            = 45,
			DXGI_FORMAT_R24_UNORM_X8_TYPELESS        = 46,
			DXGI_FORMAT_X24_TYPELESS_G8_UINT         = 47,
			DXGI_FORMAT_R8G8_TYPELESS                = 48,
			DXGI_FORMAT_R8G8_UNORM                   = 49,
			DXGI_FORMAT_R8G8_UINT                    = 50,
			DXGI_FORMAT_R8G8_SNORM                   = 51,
			DXGI_FORMAT_R8G8_SINT                    = 52,
			DXGI_FORMAT_R16_TYPELESS                 = 53,
			DXGI_FORMAT_R16_FLOAT                    = 54,
			DXGI_FORMAT_D16_UNORM                    = 55,
			DXGI_FORMAT_R16_UNORM                    = 56,
			DXGI_FORMAT_R16_UINT                     = 57,
			DXGI_FORMAT_R16_SNORM                    = 58,
			DXGI_FORMAT_R16_SINT                     = 59,
			DXGI_FORMAT_R8_TYPELESS                  = 60,
			DXGI_FORMAT_R8_UNORM                     = 61,
			DXGI_FORMAT_R8_UINT                      = 62,
			DXGI_FORMAT_R8_SNORM                     = 63,
			DXGI_FORMAT_R8_SINT                      = 64,
			DXGI_FORMAT_A8_UNORM                     = 65,
			DXGI_FORMAT_R1_UNORM                     = 66,
			DXGI_FORMAT_R9G9B9E5_SHAREDEXP           = 67,
			DXGI_FORMAT_R8G8_B8G8_UNORM              = 68,
			DXGI_FORMAT_G8R8_G8B8_UNORM              = 69,
			DXGI_FORMAT_BC1_TYPELESS                 = 70,
			DXGI_FORMAT_BC1_UNORM                    = 71,
			DXGI_FORMAT_BC1_UNORM_SRGB               = 72,
			DXGI_FORMAT_BC2_TYPELESS                 = 73,
			DXGI_FORMAT_BC2_UNORM                    = 74,
			DXGI_FORMAT_BC2_UNORM_SRGB               = 75,
			DXGI_FORMAT_BC3_TYPELESS                 = 76,
			DXGI_FORMAT_BC3_UNORM                    = 77,
			DXGI_FORMAT_BC3_UNORM_SRGB               = 78,
			DXGI_FORMAT_BC4_TYPELESS                 = 79,
			DXGI_FORMAT_BC4_UNORM                    = 80,
			DXGI_FORMAT_BC4_SNORM                    = 81,
			DXGI_FORMAT_BC5_TYPELESS                 = 82,
			DXGI_FORMAT_BC5_UNORM                    = 83,
			DXGI_FORMAT_BC5_SNORM                    = 84,
			DXGI_FORMAT_B5G6R5_UNORM                 = 85,
			DXGI_FORMAT_B5G5R5A1_UNORM               = 86,
			DXGI_FORMAT_B8G8R8A8_UNORM               = 87,
			DXGI_FORMAT_B8G8R8X8_UNORM               = 88,
			DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM   = 89,
			DXGI_FORMAT_B8G8R8A8_TYPELESS            = 90,
			DXGI_FORMAT_B8G8R8A8_UNORM_SRGB          = 91,
			DXGI_FORMAT_B8G8R8X8_TYPELESS            = 92,
			DXGI_FORMAT_B8G8R8X8_UNORM_SRGB          = 93,
			DXGI_FORMAT_BC6H_TYPELESS                = 94,
			DXGI_FORMAT_BC6H_UF16                    = 95,
			DXGI_FORMAT_BC6H_SF16                    = 96,
			DXGI_FORMAT_BC7_TYPELESS                 = 97,
			DXGI_FORMAT_BC7_UNORM                    = 98,
			DXGI_FORMAT_BC7_UNORM_SRGB               = 99,
			DXGI_FORMAT_AYUV                         = 100,
			DXGI_FORMAT_Y410                         = 101,
			DXGI_FORMAT_Y416                         = 102,
			DXGI_FORMAT_NV12                         = 103,
			DXGI_FORMAT_P010                         = 104,
			DXGI_FORMAT_P016                         = 105,
			DXGI_FORMAT_420_OPAQUE                   = 106,
			DXGI_FORMAT_YUY2                         = 107,
			DXGI_FORMAT_Y210                         = 108,
			DXGI_FORMAT_Y216                         = 109,
			DXGI_FORMAT_NV11                         = 110,
			DXGI_FORMAT_AI44                         = 111,
			DXGI_FORMAT_IA44                         = 112,
			DXGI_FORMAT_P8                           = 113,
			DXGI_FORMAT_A8P8                         = 114,
			DXGI_FORMAT_B4G4R4A4_UNORM               = 115
  		};

		public enum class GraphicsPreemptionGranularity
		{
/* Only Desktop
			DMABufferBoundary = DXGI_GRAPHICS_PREEMPTION_DMA_BUFFER_BOUNDARY,
			PrimitiveBoundary = DXGI_GRAPHICS_PREEMPTION_PRIMITIVE_BOUNDARY,
			TraiangleBoundary = DXGI_GRAPHICS_PREEMPTION_TRIANGLE_BOUNDARY,
			PixelBoundary = DXGI_GRAPHICS_PREEMPTION_PIXEL_BOUNDARY,
			InstructionBoundary = DXGI_GRAPHICS_PREEMPTION_INSTRUCTION_BOUNDARY 
*/
		};

		public enum class Residency
		{
			Resident = DXGI_RESIDENCY_FULLY_RESIDENT,
			ResidentInSharedMemory = DXGI_RESIDENCY_RESIDENT_IN_SHARED_MEMORY,
			EvictedToDisk = DXGI_RESIDENCY_EVICTED_TO_DISK 
		};

		public enum class ModeRotation
		{
		  Unspecified = DXGI_MODE_ROTATION_UNSPECIFIED,
		  Identity = DXGI_MODE_ROTATION_IDENTITY,
		  Rotate90 = DXGI_MODE_ROTATION_ROTATE90,
		  Rotate180 = DXGI_MODE_ROTATION_ROTATE180,
		  Rotate270 = DXGI_MODE_ROTATION_ROTATE270
		};

		public enum class ModeScaling
		{
			Unspecified = DXGI_MODE_SCALING_UNSPECIFIED,
			Centered = DXGI_MODE_SCALING_CENTERED,
			Strected = DXGI_MODE_SCALING_STRETCHED 
		};

		public enum class ModeScanlineOrder
		{
			Unspecified = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED,
			Progressive = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE,
			UpperFieldFirst = DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST,
			LowerFieldFirst = DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST 
		};

		public enum class OfferResourcePriotity
		{
			Low = DXGI_OFFER_RESOURCE_PRIORITY_LOW,
			Normal = DXGI_OFFER_RESOURCE_PRIORITY_NORMAL,
			High = DXGI_OFFER_RESOURCE_PRIORITY_HIGH
		};

		public enum class OutduplPointerShapeType
		{
/* Only Desktop
			Monochrome = DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME,
			Color = DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR,
			MaskedColor = DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR 
*/
		};

		public enum class Scaling
		{
			Stretch = DXGI_SCALING_STRETCH,
			None = DXGI_SCALING_NONE
		};

		public enum class SwapChainOptions
		{
			NonPrerotated = DXGI_SWAP_CHAIN_FLAG_NONPREROTATED,
			AllowModeSwitch = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH,
			GDICompatible = DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE,
			RestrictedContent = DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT,
			RestrictSharedResourceDriver = DXGI_SWAP_CHAIN_FLAG_RESTRICT_SHARED_RESOURCE_DRIVER,
			DisplayOnly = DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY
		};

		public enum class SwapEffect
		{
			Discard = DXGI_SWAP_EFFECT_DISCARD,
			Sequential = DXGI_SWAP_EFFECT_SEQUENTIAL,
			FlipSequential = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 
		};

		public enum class EnumModes
		{
			Interlaced = DXGI_ENUM_MODES_INTERLACED,
			Scaling = DXGI_ENUM_MODES_SCALING,
			Stereo = DXGI_ENUM_MODES_STEREO,
			DisableStereo = DXGI_ENUM_MODES_DISABLED_STEREO 
		};

		public enum class PresentOptions
		{
			None = 0,
			DoNotSequence = DXGI_PRESENT_DO_NOT_SEQUENCE,
			Test = DXGI_PRESENT_TEST,
			Restart = DXGI_PRESENT_RESTART,
			DoNotWait = DXGI_PRESENT_DO_NOT_WAIT,
			RestrictToOutput = DXGI_PRESENT_RESTRICT_TO_OUTPUT,
			StereoPreferRight = DXGI_PRESENT_STEREO_PREFER_RIGHT,
			StereoTemporaryMono = DXGI_PRESENT_STEREO_TEMPORARY_MONO
		};

		public enum class Status
		{
			Occluded = DXGI_STATUS_OCCLUDED,
			ModeChanged = DXGI_STATUS_MODE_CHANGED,
			ModeChangeInProgress = DXGI_STATUS_MODE_CHANGE_IN_PROGRESS 
		};

		public enum class Usage
		{
			BackBuffer = DXGI_USAGE_BACK_BUFFER,
			Discard = DXGI_USAGE_DISCARD_ON_PRESENT,
			ReadOnly = DXGI_USAGE_READ_ONLY,
			RenderTargetOutput = DXGI_USAGE_RENDER_TARGET_OUTPUT,
			ShaderInput = DXGI_USAGE_SHADER_INPUT,
			Shared = DXGI_USAGE_SHARED,
			UnorderedAccess = DXGI_USAGE_UNORDERED_ACCESS 
		};

		public enum class Error
		{
			DeviceHung = DXGI_ERROR_DEVICE_HUNG, 
			DeviceRemoved = DXGI_ERROR_DEVICE_REMOVED,
			DeviceReset = DXGI_ERROR_DEVICE_RESET, 
			DriverInternalError = DXGI_ERROR_DRIVER_INTERNAL_ERROR, 
			FrameStatisticDisjoint = DXGI_ERROR_FRAME_STATISTICS_DISJOINT, 
			GraphicsVidpnSourceInUse = DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE, 
			InvalidCall = DXGI_ERROR_INVALID_CALL, 
			MoreData = DXGI_ERROR_MORE_DATA, 
			NonExclusive = DXGI_ERROR_NONEXCLUSIVE, 
			NotCurrentlyAvailable = DXGI_ERROR_NOT_CURRENTLY_AVAILABLE,  
			NotFound = DXGI_ERROR_NOT_FOUND, 
			RemoteClientDisconnected = DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED, 
			RemoteOutOfMemory = DXGI_ERROR_REMOTE_OUTOFMEMORY, 
			WasStillDrawing = DXGI_ERROR_WAS_STILL_DRAWING, 
			Unsupported = DXGI_ERROR_UNSUPPORTED, 
			AccessLost = DXGI_ERROR_ACCESS_LOST, 
			WaitTimeout = DXGI_ERROR_WAIT_TIMEOUT, 
			SessionDisconnected = DXGI_ERROR_SESSION_DISCONNECTED, 
			RestrictToOutputStale = DXGI_ERROR_RESTRICT_TO_OUTPUT_STALE, 
			CannotProtectContent = DXGI_ERROR_CANNOT_PROTECT_CONTENT, 
			AccessDebied = DXGI_ERROR_ACCESS_DENIED 
		};
	}
}